//
//  KVOTestViewController.swift
//  iOS-RxSwift-Tutorials_Example
//
//  Created by mengru.tian on 2020/9/24.
//  Copyright © 2020 CocoaPods. All rights reserved.
//

import UIKit
import RxSwift

class KVOTestViewController: UIViewController {
    
    let disposeBag = DisposeBag()
     
    @objc dynamic var message = "hangge.com"
    
    @IBOutlet weak var tableView: UITableView!
    //导航栏背景视图
    var barImageView:UIView?
    
    override func viewDidLoad() {
        super.viewDidLoad()

        title = "57.键值观察KVO的使用"
        view.backgroundColor = .white
        test()
        test1()
        test2()
    }
    
    // 监听基本类型的属性
    func test() {
        //定时器（1秒执行一次）
        Observable<Int>.interval(1, scheduler: MainScheduler.instance)
            .subscribe(onNext: { [unowned self] _ in
                //每次给字符串尾部添加一个感叹号
                self.message.append("!")
            }).disposed(by: disposeBag)
         
        //监听message变量的变化
        _ = self.rx.observeWeakly(String.self, "message")
            .subscribe(onNext: { (value) in
            print(value ?? "")
        })
    }
    
    // 监听视图尺寸变化
    func test1() {
        //监听视图frame的变化
        _ = self.rx.observe(CGRect.self, "view.frame")
            .subscribe(onNext: { frame in
                print("--- 视图尺寸发生变化 ---")
                print(frame!)
                print("\n")
            })
    }
    
    // 通过 KVO 监听偏移量的变化来动态改变导航栏的背景透明度
    func test2() {
        //导航栏背景色为橙色
        self.navigationController?.navigationBar.barTintColor = .orange
        //获取导航栏背景视图
        self.barImageView = self.navigationController?.navigationBar.subviews.first
        //创建一个重用的单元格
        self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        //初始化数据
        let items = Observable.just(Array(0...100).map{ "这个是条目\($0)"})
         
        //设置单元格数据（其实就是对 cellForRowAt 的封装）
        items.bind(to: tableView.rx.items) { (tableView, row, element) in
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
            cell.textLabel?.text = "\(element)"
            return cell
        }
        .disposed(by: disposeBag)
         
        //使用kvo来监听视图偏移量变化
        _ = self.tableView.rx.observe(CGPoint.self, "contentOffset")
            .subscribe(onNext: {[weak self] offset in
                var delta = offset!.y / CGFloat(64) + 1
                delta = CGFloat.maximum(delta, 0)
                self?.barImageView?.alpha = CGFloat.minimum(delta, 1)
            })
    }

}
